package com.baifc.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order;

/**
 * projectName: spring-in-action
 * packageName: com.baifc.wiringbean.aop
 * Created: 2019/5/4.
 * Auther: baifc
 * Description: 观众类，这将是一个切面
 */
//@Aspect   // 当把该类中的Aspect相关的注解都去掉的情况下，这个类仅仅只会是一个Java类，这里尝试从xml中配置切面
public class Audience {     // TODO 参数的传递未手写！


//    @Pointcut("execution(* com.baifc.aop.Performance.perform(..))")
//    public void performance() {}


    // TODO 多个before的情况下，他们的顺序是怎么决定的呢？
//    @Before("performance()")
    public void taskSeats() {
        System.out.println("Taking seats!");
    }


//    @Before("performance()")
    public void silenceCellphones() {
        System.out.println("Silencing cell phones!");
    }

//    @AfterReturning("performance()")
    // 喝彩
    public void applause() {
        System.out.println("CLAP CLAP CLAP");
    }

//    @AfterThrowing("performance()")
    // 要求退款
    public void demandRefund() {
        System.out.println("Demanding a refund");
    }


//    @Around("performance()")    // 这是一个环绕通知
//    public void watchPerformance(ProceedingJoinPoint proceedingJoinPoint) {
//        System.out.println("Taking seats!");
//        System.out.println("Silencing cell phones!");
//        try {
//            Signature signature = proceedingJoinPoint.getSignature();
//            // 获取被通知的方法名 signature.getName() = perform
//            System.out.println("signature.getName() = " + signature.getName());
//            // 获取被通知的类名 signature.getDeclaringTypeName() = com.baifc.aop.Performance
//            System.out.println("signature.getDeclaringTypeName() = " + signature.getDeclaringTypeName());
//            // signature.getModifiers() = 1025  // TODO ?
//            System.out.println("signature.getModifiers() = " + signature.getModifiers());
//            proceedingJoinPoint.proceed();
//            System.out.println("CLAP CLAP CLAP");
//        } catch (Throwable throwable) {
//            System.out.println("Demanding a refund");
//        }
//    }

}
